package com.atguigu.common.valid;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;

/*
    自定义校验器
        ConstraintValidator包括两个泛型,泛型一代表需要作用于哪个注解上,泛型二代表该注解作用于什么类型的参数上
        如果需要 @ListValue 需要定义在多个类型的参数上,比如还需要作用于 Double 上,则可以再编写一个自定义校验
        器,将泛型二改为 Double 即可,在 @ListValue 注解中的 Constraint 上可以定义多个自定义校验器
 */
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {

    private Set<Integer> set = new HashSet<>();

    //初始化方法,会将 @ListValue 注解的详细信息传入
    @Override
    public void initialize(ListValue constraintAnnotation) {
        int[] vals = constraintAnnotation.vals();
        //将所有符合要求的值(@ListValue 注解中定义的值)放入到Set集合中
        for(int val : vals){
            set.add(val);
        }
    }

    /*
        判断是否校验成功
            value 代表这次需要进行校验的值,比如 @ListValue 注解标注的字段这次的值为 3 ,则需要判定这个 3 是否满足要求
            constraintValidatorContext 代表上下文环境信息
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
        //判定 set 中有没有包含提交的值即可,包含了返回 true, 没包含返回 false
        return set.contains(value);
    }
}
